#include "chart_data.h"

chart_data::chart_data(QWidget *parent) : QWidget(parent)
{

    button_clear =new QPushButton();
    button_clear->setText("clear");
    // 设置按钮样式
    button_clear->setStyleSheet(
        "QPushButton {"
        "   background-color: #4CAF50;"  // 绿色背景
        "   color: white;"              // 白色文字
        "   border: none;"
        "   padding: 5px 10px;"
        "   border-radius: 4px;"
        "}"
        "QPushButton:hover {"
        "   background-color: #45a049;"  // 鼠标悬停时稍深的绿色
        "}"
        "QPushButton:pressed {"
        "   background-color: #3e8e41;"  // 按下时更深的绿色
        "}"
    );

    // 连接信号和槽
    connect(button_clear, &QPushButton::clicked, this, &chart_data::on_button_clear_clicked);


    // 设置图表标题和背景
    chart.setTitle("步进电机目标速度");
    chart.setBackgroundVisible(true);
    chart.setBackgroundBrush(QBrush(QColor(255,255,255)));  // 天空蓝颜色

    // 创建图表视图
    chartView = new QChartView(this);
    chartView->setChart(&chart);


    // 设置线条样式
    QPen pen(Qt::red);
    pen.setWidth(2);
    LineSeries.setPen(pen);

    // 添加序列到图表
    chart.addSeries(&LineSeries);

    // 设置坐标轴
    AxisX.setGridLineVisible(false);
    AxisY.setGridLineVisible(false);
    AxisX.setRange(0,100);
    AxisY.setRange(0,100);

    // 设置坐标轴标题字体
    QFont axisTitleFont;
    axisTitleFont.setFamily("Maple Mono SC NF");
    axisTitleFont.setPointSize(12);
    AxisX.setTitleFont(axisTitleFont);
    AxisY.setTitleFont(axisTitleFont);

    // 设置坐标轴标题
    AxisX.setTitleText("Time(s)");
    AxisY.setTitleText("velocity(rpm)");

    // 添加坐标轴并关联序列
    chart.addAxis(&AxisX, Qt::AlignBottom);
    chart.addAxis(&AxisY, Qt::AlignLeft);
    LineSeries.attachAxis(&AxisX);
    LineSeries.attachAxis(&AxisY);

    timer->start(10);

    connect(timer, &QTimer::timeout, [this]() {
        time += 0.1;
    });

    //添加button到布局
    vlayout->addWidget(button_clear);
    //添加chart到布局
    vlayout->addWidget(chartView);

}



// 接收新数据并更新图表
void chart_data::append_time_data(float time, float data)
{
    //给容器添加数据
    Pointf.append(QPointF(time, data));

    //动态调整X轴
    AxisX.setRange(0, time);

    if (Pointf.size() > 1000)
    {
        Pointf.removeFirst();
        AxisX.setRange(Pointf.first().x(), time);
    }

    //动态调整Y轴
    if (!Pointf.isEmpty())
    {
        double minY = 0; // 最小值为0
        double maxY = 0; // 初始化为0

        // 找出最大值
        for (const QPointF& point : Pointf)
        {
            if (point.y() > maxY) maxY = point.y();
        }

        // 添加10%的边距
        double margin = qMax(1.0, maxY * 0.1);
        maxY += margin;

        // 更新Y轴范围
        AxisY.setRange(minY, maxY);
    }

    //更新图表数据
    LineSeries.replace(Pointf);
}



// 接收新数据并更新图表
void chart_data::append_data( float data)
{
    //给容器添加数据
    Pointf.append(QPointF(time, data));

    //动态调整X轴
    AxisX.setRange(0, time);

    if (Pointf.size() > 1000)
    {
        Pointf.removeFirst();
        AxisX.setRange(Pointf.first().x(), time);
    }

    //动态调整Y轴
    if (!Pointf.isEmpty())
    {
        double minY = 0; // 最小值为0
        double maxY = 0; // 初始化为0

        // 找出最大值
        for (const QPointF& point : Pointf)
        {
            if (point.y() > maxY) maxY = point.y();
        }

        // 添加10%的边距
        double margin = qMax(1.0, maxY * 0.1);
        maxY += margin;

        // 更新Y轴范围
        AxisY.setRange(minY, maxY);
    }

    //更新图表数据
    LineSeries.replace(Pointf);
}


void chart_data::on_button_clear_clicked()
{
    clear();
}

void chart_data::set_axisY_name(const QString &name)
{
    AxisY.setTitleText(name);
    AxisY.setTitleFont(QFont("Maple Mono SC NF", 15));
}

void chart_data::set_title_name(const QString &name)
{
    chart.setTitle(name);
    chart.setTitleFont(QFont("Maple Mono SC NF", 20));
}
